package com.blacktech.dbu.meta.repository;

import com.blacktech.dbu.core.dict.DatabaseDialect;
import com.blacktech.dbu.meta.entity.DbuSchema;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 数据库模式信息Repository
 * 移除Spring Data REST注解，改为自定义Controller
 *
 * @author yanyunsong
 */
@Repository
public interface SchemaRepository extends JpaRepository<DbuSchema, Long>, JpaSpecificationExecutor<DbuSchema> {

    
    /**
     * 根据产品ID查找所有数据库模式（按名称排序）
     * @param productId 产品ID
     * @return 数据库模式列表
     */
    List<DbuSchema> findByProductIdOrderBySchemaName(Long productId);

    /**
     * 检查产品下Schema名称是否存在
     * @param productId 产品ID
     * @param schemaName Schema名称
     * @return 是否存在
     */
    boolean existsByProductIdAndSchemaName(Long productId, String schemaName);

    /**
     * 检查产品下Schema名称是否存在（排除指定ID）
     * @param productId 产品ID
     * @param schemaName Schema名称
     * @param id 排除的Schema ID
     * @return 是否存在
     */
    @Query("SELECT COUNT(s) > 0 FROM DbuSchema s WHERE s.product.id = :productId AND s.schemaName = :schemaName AND s.id != :id")
    boolean existsByProductIdAndSchemaNameAndIdNot(@Param("productId") Long productId, @Param("schemaName") String schemaName, @Param("id") Long id);

    /**
     * 根据产品ID和Schema名称查找Schema
     * @param productId 产品ID
     * @param schemaName Schema名称
     * @return Schema
     */
    DbuSchema findByProductIdAndSchemaName(Long productId, String schemaName);

    /**
     * 根据产品ID列表查找Schema（按产品名称和Schema名称排序）
     * @param productIds 产品ID列表
     * @return Schema列表
     */
    @Query("SELECT s FROM DbuSchema s WHERE s.product.id IN :productIds ORDER BY s.product.productName ASC, s.schemaName ASC")
    List<DbuSchema> findByProductIdInOrderByProductNameAscSchemaNameAsc(@Param("productIds") List<Long> productIds);

    /**
     * 获取Schema按数据库类型统计信息
     * @return 统计结果
     */
    @Query("SELECT s.dbType, COUNT(s) FROM DbuSchema s GROUP BY s.dbType")
    List<Object[]> getSchemaTypeStatistics();

    /**
     * 根据数据库类型查找Schema
     * @param databaseType 数据库类型
     * @return Schema列表
     */
    List<DbuSchema> findByDbType(DatabaseDialect databaseType);

    /**
     * 根据产品ID和数据库类型查找Schema
     * @param productId 产品ID
     * @param databaseType 数据库类型
     * @return Schema列表
     */
    List<DbuSchema> findByProductIdAndDbType(Long productId, DatabaseDialect databaseType);

    /**
     * 模糊搜索Schema
     */
    @Query("SELECT s FROM DbuSchema s WHERE " +
           "LOWER(s.schemaName) LIKE LOWER(CONCAT('%', :keyword, '%')) OR " +
           "LOWER(s.description) LIKE LOWER(CONCAT('%', :keyword, '%'))")
    List<DbuSchema> searchByKeyword(@Param("keyword") String keyword);

    /**
     * 检查产品下是否有Schema
     * @param productId 产品ID
     * @return 是否有Schema
     */
    boolean existsByProductId(Long productId);
}